{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 简介\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "polyglot_notebook": {
     "kernelName": "csharp"
    },
    "vscode": {
     "languageId": "polyglot-notebook"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>YiJingFramework.PrimitiveTypes.GuaWithFixedCount, 4.0.1</span></li></ul></div></div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#r \"nuget:YiJingFramework.PrimitiveTypes.GuaWithFixedCount\"\n",
    "using YiJingFramework.PrimitiveTypes;\n",
    "using YiJingFramework.PrimitiveTypes.GuaWithFixedCount;\n",
    "using YiJingFramework.PrimitiveTypes.GuaWithFixedCount.Extensions;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此包提供了一系列类型，可以表示具有固定爻数的卦，便于在编译期及时发现爻数错误。此包使用了源代码生成器技术，使用相同的模板生成了 `GuaEmpty` 、 `GuaWith1Yao` 、 `GuaWith2Yaos` 、 `GuaTrigram` 、 `GuaWith4Yaos` 、 `GuaWith5Yaos` 、 `GuaHexagram` 、 `GuaWith7Yaos` 、 `GuaWith8Yaos` 和 `GuaWith9Yaos` 十种类型，因此它们的表现会是完全相同的。\n",
    "\n",
    "它们提供了与 `Gua` （在 [YiJingFramework.PrimitiveTypes](https://yjfwk.yueyinqiu.top/PrimitiveTypes/) 中）非常类似的功能，只是额外在创建时进行了爻数检查。在它们的内部就是保存了一个 `Gua` ，几乎所有行为都是调用它来实现的。可以通过 `AsGua` 和 `AsFixed` 方法将具有固定爻数的卦和 `Gua` 相互转换："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "dotnet_interactive": {
     "language": "csharp"
    },
    "polyglot_notebook": {
     "kernelName": "csharp"
    },
    "vscode": {
     "languageId": "polyglot-notebook"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "var trigram = new GuaTrigram(Yinyang.Yang, Yinyang.Yin, Yinyang.Yin);\n",
    "var gua = trigram.AsGua();\n",
    "var t = gua.AsFixed<GuaTrigram>();\n",
    "Console.WriteLine(trigram == t);\n",
    "\n",
    "Console.WriteLine(trigram.Equals(gua));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "需注意上例中 `trigram.Equals(gua)` 的值为 `false` ，因为这些具有固定爻数的卦与 `Gua` 被视为完全无关的类型。它们之间不具有继承关系，不可以进行比较等操作，也不提供显式或隐式转换运算。除此之外，这些具有固定爻数的卦还不提供 `ToBytes` 和 `FromBytes` 方法，可以先转换为 `Gua` 再进行操作。这种转换的开销并不大，因为它会直接返回内部的 `Gua` 而没有进行复制操作。\n",
    "\n",
    "最后值得一提的是，所有的固定爻数的卦全部实现了 `IGuaWithFixedCount` 接口，在设计一些关于它们的方法的时候可能会比较方便，比如获取错卦，可以指定一个泛型 `TGua : notnull, IGuaWithFixedCount` 的参数，返回值也是相同的 `TGua` 。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "file_extension": ".cs",
   "mimetype": "text/x-csharp",
   "name": "python",
   "pygments_lexer": "csharp",
   "version": "3.12.2"
  },
  "polyglot_notebook": {
   "kernelInfo": {
    "defaultKernelName": "csharp",
    "items": [
     {
      "aliases": [],
      "name": "csharp"
     }
    ]
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
